const defaultConfig = {
    method: 'GET',
    header: {
        'content-type': 'application/json' // 默认值
    },
    timeout: 10000, // 超时时间
    dataType: 'json', // 返回的数据类型
    responseType: 'text', // 响应的数据类型
    baseUrl: 'http://localhost:8080/api' // 配置基础 URL
};

/**
 * 请求拦截器
 * @param {Object} options 请求配置
 * @returns {Object} 修改后的请求配置
 */
function requestInterceptor(options) {
    // 在这里可以添加 token 或其他全局头部信息
    const token = uni.getStorageSync('token');
    if (token) {
        options.header['An-Authorization'] = `Bearer ${token}`;
    }
    return options;
}

/**
 * 响应拦截器
 * @param {Object} res 响应对象
 * @returns {Object} 修改后的响应对象
 */
function responseInterceptor(res) {
    // 在这里可以处理响应数据
    if (res.statusCode === 401) {
        // 处理未授权的情况
        uni.showToast({title: '请重新登录', icon: 'none'})
            .then(() => {
                // 清空令牌
                uni.removeStorageSync('token');
                // 可以跳转到登录页面
                // uni.navigateTo({ url: '/pages/login/login' });
            });
    }
    return res;
}

/**
 * 封装的 request 方法
 * @param {Object} options 请求配置
 * @returns {Promise}
 */
function request(options) {
    return new Promise((resolve, reject) => {
        // 开启加载弹窗
        uni.showLoading({
            title: '连接中...',
            mask: true
        }).then(() => {
        })

        const config = Object.assign({}, defaultConfig, options);
        const modifiedConfig = requestInterceptor(config);

        // 拼接 baseUrl 和 url
        const fullUrl = modifiedConfig.baseUrl + modifiedConfig.url;

        uni.request({
            ...modifiedConfig,
            url: fullUrl,
            success: (res) => {
                const processedResponse = responseInterceptor(res);
                if (processedResponse.statusCode >= 200 && processedResponse.statusCode < 300) {
                    resolve(processedResponse.data);
                } else {
                    reject(new Error(`Request failed with status code ${processedResponse.statusCode}`));
                }
            },
            fail: (err) => {
                uni.showToast({
                    title: '服务器连接错误',
                    icon: 'none',
                    duration: 2000
                }).then(() => {
                    reject(err);
                });
            },
            complete: () => {
                // 可以在这里做一些清理工作
                uni.hideLoading();
            }
        });
    });
}

/**
 * GET 请求
 * @param {string} url 请求地址
 * @param {Object} params 查询参数
 * @returns {Promise}
 */
function get(url, params = {}) {
    return request({
        url,
        method: 'GET',
        data: params
    });
}

/**
 * POST 请求
 * @param {string} url 请求地址
 * @param {Object} data 请求体
 * @returns {Promise}
 */
function post(url, data) {
    return request({
        url,
        method: 'POST',
        data: JSON.stringify(data),
        header: {
            ...defaultConfig.header,
            'content-type': 'application/json'
        }
    });
}

// 导出封装的方法
export {request, get, post};
